package com.zoke.support.utils;

import java.util.Date;

import android.content.Context;
import android.text.TextUtils;

import com.zoke.support.base.BaseApp;
import com.zoke.support.domain.CacheUrlInfo;
import com.zoke.support.http.ZokeParams;

/**
 * 缓存操作工具
 * 
 * @author JackWu
 * @version
 * @date 2014-11-18
 * @_QQ_ 651319154
 */
public class CacheManager {

	private CacheManager(Context context) {
		this.mApp = (BaseApp) context.getApplicationContext();
	}

	private static CacheManager cm;
	private BaseApp mApp;

	public synchronized static CacheManager getManager(Context context) {
		if (cm == null) {
			cm = new CacheManager(context);
		}
		return cm;
	}

	/** 保存缓存 **/
	public boolean saveCache(ZokeParams param) {
		if (param == null) {
			LogUtil.e("参数为null");
			return false;
		}
		String resultStr = (String) param.getResult();
		String url = getUrlByParams(param);
		LogUtil.i("-----------存储成功-----------");
		return saveCache(url, resultStr);
	}

	/** 根据参数获取url唯一标示 **/
	protected String getUrlByParams(ZokeParams param) {
		if (param != null)
			return param.getUrl() + "?=" + param.toString();
		LogUtil.e("参数为null");
		return "";
	}

	/** 保存 url需要拼参数 **/
	@Deprecated
	public boolean saveCache(String url, String jsonValue) {
		if (TextUtils.isEmpty(url) || TextUtils.isEmpty(jsonValue)) {
			LogUtil.e("url或者JsonValue==null");
			return false;
		}
		// 如果数据库中不存在 则直接保存 否则不存
		if (mApp.createDb() == null) {
			LogUtil.e("数据库引用为null");
			return false;
		}
		LogUtil.i("加密前" + url);
		// 对Url进行md5加密加密
		url = CommonUtil.MD5(url);
		LogUtil.i("加密后" + url);
		//
		CacheUrlInfo dbCache = mApp.createDb()
				.findById(url, CacheUrlInfo.class);
		if (dbCache != null) {
			LogUtil.e("数据库中已经存在该数据");
			// 更新一下数据
			dbCache.setJsonString(jsonValue);
			dbCache.setUpdateTime(new Date().getTime());
			updateCache(dbCache);
			return false;
		}
		// 存储--获取手机系统的当前时间
		CacheUrlInfo cInfo = new CacheUrlInfo(url, jsonValue,
				new Date().getTime());
		mApp.createDb().save(cInfo);
		return true;
	}

	/** 更新字段 **/
	private void updateCache(CacheUrlInfo info) {
		mApp.createDb().update(info);
	}

	/** 删除缓存 根据url **/
	public boolean deleteCache(ZokeParams param) {
		if (param == null) {
			LogUtil.e("参数为null");
			return false;
		}
		String url = getUrlByParams(param);
		return deleteCacheByUrl(url);
	}

	/** 删除数据根据id url要拼请求参数 变成唯一标示 **/
	@Deprecated
	public boolean deleteCacheByUrl(String url) {
		//
		if (TextUtils.isEmpty(url)) {
			LogUtil.e("url==null");
			return false;
		}

		if (mApp.createDb() == null) {
			LogUtil.e("数据库引用为null");
			return false;
		}

		LogUtil.i("加密前" + url);
		// 对Url进行md5加密加密
		url = CommonUtil.MD5(url);
		LogUtil.i("加密后" + url);
		mApp.createDb().deleteById(CacheUrlInfo.class, url);
		return true;
	}

	/** 根据参数获取缓存对象 **/
	public CacheUrlInfo getCache(ZokeParams param) {
		if (param == null) {
			LogUtil.e("参数为null");
			return null;
		}
		String url = getUrlByParams(param);
		return getCacheByUrl(url);

	}

	/** 根据url（id）来获取缓存对象 **/
	@Deprecated
	public CacheUrlInfo getCacheByUrl(String url) {
		if (TextUtils.isEmpty(url)) {
			LogUtil.e("url==null");
			return null;
		}

		if (mApp.createDb() == null) {
			LogUtil.e("数据库引用为null");
			return null;
		}
		LogUtil.i("加密前" + url);
		// 对Url进行md5加密加密
		url = CommonUtil.MD5(url);
		LogUtil.i("加密后" + url);
		CacheUrlInfo cUrl = mApp.createDb().findById(url, CacheUrlInfo.class);
		return cUrl;
	}

}
